
#ifndef DESIGN_PATTERNS_UTILS_UTILS_H
#define DESIGN_PATTERNS_UTILS_UTILS_H

#include <string>

namespace utils
{
class Exception
{
private:
  std::string detail_;

public:
  Exception() = default;

  explicit Exception(std::string detail);

  virtual std::string What();

  virtual ~Exception() = default;
};

class NullptrException : public Exception
{
public:
  explicit NullptrException(std::string detail);

  std::string What() override;

  ~NullptrException() override = default;
};

/**
 * 以忽略大小写的方法比较两个字符串
 *
 * @param f 第一个待比较字符串
 * @param s 第二个待比较的字符串
 * @return  如果两个字符串忽略大小写后且按序的字符相等则返回true，否则返回false。
 */
bool Stricmp(const std::string& f, const std::string& s);

/**
 * 断言指针p不可能为空，否则抛出异常
 *
 * @param p 用于测试是否为空的指针
 */
void Assertnnull(void* p);

/**
 * 断言指针p不可能为空，否则抛出异常并指定异常详细信息
 *
 * @param p  用于测试是否为空的指针
 * @param msg p为空的情况下，抛出异常的详细信息
 */
void Assertnnull(void* p, std::string msg);
}

#endif //DESIGN_PATTERNS_UTILS_UTILS_H
